其他
深入剖析 Spring Boot 的 SPI 机制
Java SPI实现
示例说明
创建动态接口
{
void call();
}
实现类1
{
@Override
public void call()
{
System.out.println("this is mp3 call");
}
}
实现类2
{
@Override
public void call()
{
System.out.println("this is mp4 call");
}
}
相关测试
{
public static void main(String[] args)
{
ServiceLoader<VedioSPI> serviceLoader =ServiceLoader.load(VedioSPI.class);
serviceLoader.forEach(t->{
t.call();
});
}
}
运行结果:
源码分析
ServiceLoader类本身实现了Iterable接口并实现了其中的iterator方法,iterator方法的实现中调用了LazyIterator这个内部类中的方法,迭代器创建实例。 所有服务提供接口的对应文件都是放置在META-INF/services/目录下,final类型决定了PREFIX目录不可变更。
Java内置的方法方式只能通过遍历来获取 服务提供接口必须放到META-INF/services/目录下。
Spring SPI
Spring 示例
定义接口
{
void getConnection();
}
相关实现
public class DB2DataBase implements DataBaseSPI
{
@Override
public void getConnection()
{
System.out.println("this database is db2");
}
}
##Mysql实现
public class MysqlDataBase implements DataBaseSPI
{
@Override
public void getConnection()
{
System.out.println("this is mysql database");
}
}
相关测试类
{
public static void main(String[] args)
{
List<DataBaseSPI> dataBaseSPIs =SpringFactoriesLoader.loadFactories(DataBaseSPI.class,
Thread.currentThread().getContextClassLoader());
for(DataBaseSPI datBaseSPI:dataBaseSPIs){
datBaseSPI.getConnection();
}
}
}
输出结果
Java SPI是一个服务提供接口对应一个配置文件,配置文件中存放当前接口的所有实现类,多个服务提供接口对应多个配置文件,所有配置都在services目录下; Spring factories SPI是一个spring.factories配置文件存放多个接口及对应的实现类,以接口全限定名作为key,实现类作为value来配置,多个实现类用逗号隔开,仅spring.factories一个配置文件。
源码分析
END
往期精彩阿里版ChatGPT已进入测试,中文聊天截图曝光!
从历代GC算法角度刨析ZGC
再见 Feign ,Spring 6 新特性:HTTP Interface 来了!
终于搞懂了 @Configuration 和 @Component 的区别 !
关注后端面试那些事,回复【2022面经】
获取最新大厂Java面经